package com.yj.lcj.utils;


import com.yj.lcj.exception.ApiRespones;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * redis工具类
 */
@Component
public class TokenManager {

    private static final String SESSIONS_KEY = "user_sessions";

    @Autowired
    private  RedisTemplate<String,String> redisTemplate;

    private static final String TOKEN_PREFIX = "token:";
    private static final long TOKEN_EXPIRATION_SECONDS = 3600*24; // Token有效期为1小时

    /**
     * 生成token
     * @param userId
     * @return
     */
    public String generateToken(String userId) {
        String token = null;
        // 通过userid获取UUid
        String redisToken = redisTemplate.opsForValue().get(userId);
        //判断当前用户的token 当用户在另一台设备登陆时，原先的设备会被顶掉 （删除原先的token）
       if (redisToken != null){
           expireToken(redisToken);
       }
        // 生成uuid（token）
        token = UUID.randomUUID().toString();
        // 即将要存储的 key
        String key = TOKEN_PREFIX + token;
        redisTemplate.opsForValue().set(key, userId, TOKEN_EXPIRATION_SECONDS, TimeUnit.SECONDS);
        redisTemplate.opsForValue().set(userId,key,TOKEN_EXPIRATION_SECONDS, TimeUnit.SECONDS);
        return token;
    }

    /**
     * 验证token
     * @param token
     * @return
     */
    public boolean validateToken(String token) {
        String key = TOKEN_PREFIX + token;
        return redisTemplate.hasKey(key);
    }

    /**
     * 通过key获取value
     * @param token
     * @return
     */
    public String getUserIdFromToken(String token) {
        String key = TOKEN_PREFIX + token;
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除token
     * @param token
     */
    public void expireToken(String token) {
        String key = token;
        String userId = redisTemplate.opsForValue().get(key);
        redisTemplate.delete(userId);
        redisTemplate.delete(key);
    }

    /**
     * 删除token  (用于“用户注销”)
     * @param userId
     */
    public void deleteToken(int userId){
        String token = redisTemplate.opsForValue().get(userId);
        expireToken(token);
    }

    /**
     * 删除token （用于“用户退出登录”）
     */
    public void layoutToken(String token){
        // 退出之前先验证token在redis中是否存在
        boolean flag = validateToken(token);
        if (flag == false){
            throw new ApiRespones("409","您已处于下线状态");
        }
        String key = TOKEN_PREFIX+token;
        String userId = redisTemplate.opsForValue().get(key);
        redisTemplate.delete(userId);
        redisTemplate.delete(key);
    }


    // 简单的缓存键值对 (存入验证码)
    public  void setKey(String key,int value){
       redisTemplate.opsForValue().set(key, String.valueOf(value),600000, TimeUnit.MILLISECONDS);
    };

    // 获取 生成的验证码
    public  String getValue(String key){
        return redisTemplate.opsForValue().get(key);
    }

//    // 获取key
//    public  Boolean getKey(String key){
//        return redisTemplate.hasKey(key);
//    }
//
//
//
//    /**
//     * 存储token
//     * @param key
//     * @param value
//     */
//    public  void setToken(String key,String value){
//
//        redisTemplate.opsForValue().set(key, String.valueOf(value),3600*24*7,TimeUnit.DAYS);
//    }
//
//    /**
//     * 删除key
//     * @param key
//     * @return
//     */
//    public boolean delKey(String key){
//        return redisTemplate.delete(key);
//    }
//
//    public void addSession(String userId, String sessionId) {
//        redisTemplate.opsForHash().put(SESSIONS_KEY, userId, sessionId);
//    }
//
//    public String getSession(String userId) {
//        return (String) redisTemplate.opsForHash().get(SESSIONS_KEY, userId);
//    }
//
//    public void removeSession(String userId) {
//        redisTemplate.opsForHash().delete(SESSIONS_KEY, userId);
//    }

}
